package org.company.earth.arithmetic.concept;

import org.company.earth.arithmetic.TreeNode;

/**
 * 树结构的接口类
 * @ClassName:Tree.java
 * Title:
 * Description:
 * Copyright:Copyright(c)2012
 * Company:www.si-tech.com.cn
 * @author:hucw
 * @date:2012-10-12
 * @version 1.0
 */
public interface Tree<T> {
	
	/**
	 * 构件空树 
	 * @param t
	 */
	public void initTree();
	
	/**
	 * 销毁树
	 */
	public void destroyTree();
	
	/**
	 * 根据函数构件树
	 * @param t
	 */
	public void createTree();
	
	/**
	 * 把T清空为空树
	 * @param t
	 */
	public void clearTree();
	
	/**
	 * 是否是空树
	 * @param t
	 * @return
	 */
	public boolean emptyTree();
	
	/**
	 * 返回树的深度
	 * @return
	 */
	public int depthTree();
	
	/**
	 * 返回树的根节点
	 * @return
	 */
	public TreeNode<T> rootTree();
	
	/**
	 * 返回node节点的数据
	 * @param node
	 * @return
	 */
	public T value(TreeNode<T> node);
	
	/**
	 * 给node赋值
	 * @param node
	 * @param t
	 */
	public void assign(TreeNode<T> node,T t);
	
	/**
	 * 返回node的父亲节点
	 * @param node
	 * @return
	 */
	public TreeNode<T> parent(TreeNode<T> node);
	
	/**
	 * 返回node的最左子节点
	 * @param node
	 * @return
	 */
	public TreeNode<T> leftChild(TreeNode<T> node);
	
	/**
	 * 返回node的右兄弟节点
	 * @param node
	 * @return
	 */
	public TreeNode<T> rightSibling(TreeNode<T> node);
	
	/**
	 * 在node的子节点的i位置插入child
	 * @param node
	 * @param i
	 * @param child
	 */
	public void insertChild(TreeNode<T> node,int i,TreeNode<T> child);
	
	/**
	 * 在node子节点的最后一个位置插入child
	 * @param node
	 * @param child
	 */
	public void insertChild(TreeNode<T> node,TreeNode<T> child);
	
	/**
	 * 删除node在i位置的子节点
	 * @param node
	 * @param i
	 */
	public void deleteChild(TreeNode<T> node,int i);
	
	/**
	 * 删除node的最后一个子节点
	 * @param node
	 */
	public void deleteChild(TreeNode<T> node);
	
	/**
	 * 遍历树
	 */
	public void traverseTree();
}
